进程间通信
进程间通信(IPC,Inter-Process Communication)指进程间交换数据。广义上涵盖程序间交换数据——可以是进程、线程、进程自身收发,或分布式节点之间。它是构建复杂系统(子系统、微服务)的协同基石。
管道(Pipe)
管道提供非侵入的计算组织能力:进程无需感知管道存在,只需预留接口即可利用管道串联计算。例如:
进程1 | 进程2 | 进程3 | mysql -u... -p | 爬虫进程各进程各自计算,通过管道传递中间结果,最终入库或触发下游工作。
命名管道(Named Pipe) 用法相同,但提供编程接口,可将多个进程输出合并到同一管道,或用于本地进程与 MySQL 之间免去 TCP 三次握手开销(现代多为远程库,仅作示意)。
管道的优势是非侵入、灵活,不增加程序设计负担。
共享内存(Shared Memory)
同一进程的多个线程天然共享进程内存,无需额外处理。跨进程的线程(或跨进程程序)可用共享内存:Unix/Linux 提供 POSIX 共享库(shmem),以虚拟文件系统形式从内存划出区域供两进程共用,看上去是文件、实际操作的是内存。
共享内存速度最快,但属于侵入式开发——需调用 API 读写、自行处理并发控制与同步,程序较复杂。除非高性能场景,通常不作为首选。
本地消息 / 队列(Local Message / Queue)
- 消息队列:操作系统提供的能力(Unix 系可用 POSIX
mqueue)。进程将数据封装为格式确定的消息,便于按类型响应、按内容触发逻辑,大体量大时可构造生产者/消费者队列并发处理。 - 网络请求:直接基于 TCP/IP 等协议收发消息,本质同属收/发模式。
远程调用(RPC)
远程过程调用(Remote Procedure Call)用本地调用封装远程服务请求:调用方看起来像调用本地方法,背后由客户端 stub 转换为网络请求;服务端 stub 还原为真实方法调用。

流程(10 步):
- 客户端调用本地函数;
- 客户端 stub 封装为请求;
- 客户端 socket 发送,服务端 socket 接收;
- 服务端 stub 还原为函数调用;
- 执行服务端方法;
- 结果传回 stub;
- 服务端 stub 封装返回数据;
- 服务端 socket 发送,客户端 socket 接收;
- 返回数据传至客户端 stub;
- 客户端 stub 转义成返回值。
实战常用框架(Thrift、Dubbo、gRPC)支持多语言,依赖 IDL(接口定义语言)跨语言定义接口。
RPC 适合微服务开发。其主要缺点是增加系统间耦合——主动调用另一系统的方法会逐渐腐化系统边界,长期积累需警惕。
消息队列(解耦通信)
为降低 RPC 带来的耦合,可采用事件模型:系统订阅事件而非直接调用,依赖的是"事件"而非"另一个系统",即使提供方更替仍可正常工作。
实现事件可用消息队列。适用场景:
- 降低耦合、提升灵活性(Kafka 主打 feed 流;RabbitMQ、ActiveMQ、RocketMQ 主打应用解耦);
- 大规模数据传输(如日志收集、清洗、筛选、监控构成的分布式计算网络)。
小结
- 单机模型:管道(易写、标准接口)、共享内存(性能最高、最难写)、消息队列(好写、支持发布/订阅)。
- 分布式模型:远程调用(用 RPC 框架)、消息队列/事件(降低耦合)。
选型核心权衡:性能 vs 开发成本 vs 系统耦合度。高耦合场景优先事件/消息队列,避免边界腐化。